#include <iostream>
#include <string>
#include <cstring>

using namespace std;

class Student {
private: //默认就是private
    string name;
    int age;
public:
    void diaplay(); //先声明  后面进行定义
    Student() {}

    Student(string name, int age) {
        this->name = name;
        this->age = age;
    }

    const string &getName() const { //一个类里定义了一个const成员函数后，则此函数不能修改类中的成员变量
        //name = "ee";
        return name;
    }

    void setName(const string &name) {
        Student::name = name;
    }

    int getAge() const {
        return age;
    }

    void setAge(int age) {
        Student::age = age;
    }

};

class Test {
private:
    int x;
    char *str; //指针类型一定要被初始化才能使用
public:
    Test(int n, char *s) {
        x = n;
        //strcpy(str, s);
        str = s;
    }

    Test(const Test &t) {
        x = t.x;
        //strcpy(str, t.str);
        str = t.str;
    }

    void show() {
        cout << x << "," << str << endl;
    }
};

Student f() {
    Student s("mei", 12); //会生成临时变量 然后返回
    return s;
}

int main() {
    //const Student s("abc", 1);
    //Student *s1 = new Student("bc", 2);
    //Student &s2 = *s1;
    //
    //cout << s.getName() << endl;

    /*
     *  void print() const {}  和 void print() {}   是重载函数，假如定义的对象为const Student t，
     *  则只能调用void print () const成员函数，如果为非const，则调用void print() ；
     *
     */

    //Test *a;
    //a = new Test(100, "hello");
    //Test b(*a);
    //a->show();
    //b.show();
    //delete(a);
    //b.show(); //调用时有时会出错  因为a对象的成员str会被释放

    Student st;
    st = f(); //会调用复制构造函数
    cout << st.getName() << ", " << st.getAge() << endl;

    //一般并不把整个类声明为友元类  不要过多使用

    return 0;
}

void Student::diaplay() { //::为作用域限定符  用来表示为Student的成员函数


}